home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / misc / math / YACAS.lha / share / yacas / limit.ys < prev    next >
Text File  |  2001-05-24  |  5KB  |  158 lines

  1. /*                            */
  2. /*  Limit operator rule base  */
  3. /*                            */ 
  4.  
  5.  
  6. /*  Exponentiation rules  */
  7.  
  8. /*  Special limit #1:  0 ^ 0;  #2:  1 ^ Infinity;  #3:  Infinity ^ 0  */
  9. 200 # Lim(_var, _tar, _dir, _x ^ _y)_
  10. ( [
  11.     Local(lx,ly); lx := Lim(var, tar, dir, x); ly := Lim(var, tar, dir, y);
  12.     ((IsZero(lx) And IsZero(ly)) Or ((lx = 1) And IsInfinity(ly)) Or (IsInfinity(lx) And IsZero(ly)));
  13. ] )
  14. <-- Exp(Lim(var, tar, dir, y * Ln(x)));
  15.  
  16. /*  Default rule  */
  17. 210 # Lim(_var, _tar, _dir, _x ^ _y)
  18. <-- Lim(var, tar, dir, x)^Lim(var, tar, dir, y);
  19.  
  20.  
  21. /*  Division rules  */
  22.  
  23. /*  Special limit #4:  0 / 0;  #5:  Infinity / Infinity  */
  24. 300 # Lim(_var, _tar, _dir, _x / _y)_
  25. ( [
  26.     Local(lx,ly); lx := Lim(var, tar, dir, x); ly := Lim(var, tar, dir, y);
  27.     ((IsZero(lx) And IsZero(ly)) Or (IsInfinity(lx) And IsInfinity(ly)));
  28. ] )
  29. <-- Lim(var, tar, dir, ApplyPure("D", {var, x})/ApplyPure("D", {var, y}));
  30.  
  31. /*  Special limit #6: null denominator  */
  32. /*  Probably there are still some problems.  */
  33.  
  34. Dir(Right) <-- 1;
  35. Dir(Left) <-- -1;
  36.  
  37. /*  To get the sign of the denominator on one side:  */
  38. Sign(_var, _tar, _dir, _exp, _n)
  39. <-- [
  40.   Local(der, coef); der := ApplyPure("D", {var, exp});
  41.   coef := Eval(ApplyPure("Subst", {var, tar, der}));
  42.   If ( coef = 0,
  43.        Sign(var, tar, dir, der, n+1),
  44.        (Sign(coef)*Dir(dir)) ^ n
  45.      );
  46. ];
  47.   
  48. /*  To avoid infinite recursion (with 1/Exp(-x) for instance)  */
  49. 310 # Lim(_var, _tar, _dir, _x / _y)_
  50. (IsInfinity(tar) And IsZero(Lim(var, tar, dir, y)))
  51. <-- Sign(Lim(var, tar, dir, x))*Sign(Lim(var, tar, dir, ApplyPure("D", {var, y})))*tar;
  52.  
  53. 320 # Lim(_var, _tar, _dir, _x / _y)_IsZero(Lim(var, tar, dir, y))
  54. <-- Sign(Lim(var, tar, dir, x))*Sign(var, tar, dir, y, 1)*Infinity;
  55.  
  56.  
  57. /*  Default rule  */
  58. 330 # Lim(_var, _tar, _dir, _x / _y)
  59. <-- Lim(var, tar, dir, x)/Lim(var, tar, dir, y); ];
  60.  
  61.  
  62. /*  Multiplication rules  */
  63.  
  64. /*  To avoid some infinite recursions  */
  65. 400 # Lim(_var, _tar, _dir, _x * Exp(_y))_
  66. (IsInfinity(Lim(var, tar, dir, x)) And (Lim(var, tar, dir, y) = -Infinity))
  67. <-- Lim(var, tar, dir, x/Exp(-y));
  68. 400 # Lim(_var, _tar, _dir, Exp(_x) * _y)_
  69. ((Lim(var, tar, dir, x) = -Infinity) And IsInfinity(Lim(var, tar, dir, y)))
  70. <-- Lim(var, tar, dir, y/Exp(-x));
  71. 400 # Lim(_var, _tar, _dir, Ln(_x) * _y)_
  72. (IsZero(Lim(var, tar, dir, x)) And IsZero(Lim(var, tar, dir, y)))
  73. <-- Lim(var, tar, dir, y*Ln(x));
  74.  
  75. /*  Special limit #7:  0 * Infinity  */
  76. 410 # Lim(_var, _tar, _dir, _x * _y)_
  77. ((IsZero(Lim(var, tar, dir, x)) And IsInfinity(Lim(var, tar, dir, y)))
  78.   Or (IsInfinity(Lim(var, tar, dir, x)) And IsZero(Lim(var, tar, dir, y))))
  79. <-- Lim(var, tar, dir, Simplify(ApplyPure("D", {var, y})/ApplyPure("D",
  80. {var, 1/x})));
  81.  
  82. /*  Default rule  */
  83. 420 # Lim(_var, _tar, _dir, _x * _y)
  84. <-- Lim(var, tar, dir, x) * Lim(var, tar, dir, y);
  85.  
  86.  
  87. /*  Substraction rules  */
  88.  
  89. /*  Special limit #8:  Infinity - Infinity  */
  90. 500 # Lim(_var, _tar, _dir, _x - _y)_
  91. ( [
  92.     Local(lx,ly); lx := Lim(var, tar, dir, x); ly := Lim(var, tar, dir, y);
  93.     ((lx = Infinity) And (ly = Infinity)) Or ((lx = -Infinity) And (ly = -Infinity));
  94. ] )
  95. <-- Lim(var, tar, dir, x*(1-y/x));
  96.  
  97. /*  Default rule  */
  98. 510 # Lim(_var, _tar, _dir, _x - _y)
  99. <-- Lim(var, tar, dir, x)-Lim(var, tar, dir, y);
  100.  
  101. /*  Unary minus  */
  102. 520 # Lim(_var, _tar, _dir, - _x)
  103. <-- - Lim(var, tar, dir, x);
  104.  
  105.  
  106. /*  Addition rules  */
  107.  
  108. /*  Special limit #9:  Infinity + (-Infinity)  */
  109. 600 # Lim(_var, _tar, _dir, _x + _y)_
  110. ( [
  111.     Local(lx,ly); lx := Lim(var, tar, dir, x); ly := Lim(var, tar, dir, y);
  112.     ((lx = Infinity) And (ly = -Infinity)) Or ((lx = -Infinity) And (ly = Infinity));
  113. ] )
  114. <-- Lim(var, tar, dir, x*(1+y/x));
  115.  
  116. /*  Default rule  */
  117. 610 # Lim(_var, _tar, _dir, _x + _y)
  118. <-- Lim(var, tar, dir, x)+Lim(var, tar, dir, y);
  119.  
  120. /*  Global default rule : evaluate expression  */
  121.  
  122. 700 # Lim(_var, _tar, _dir, exp_IsFunction)
  123. <-- Eval(MapArgs(exp,"LimitArgs"));
  124.  
  125. LimitArgs(_arg) <-- Lim(var,tar,dir,arg);
  126. UnFence("LimitArgs",1); /* Allow LimitArgs to have access to the local variables of the caller. */
  127.  
  128. 701 # Lim(_var, _tar, _dir, _exp)
  129. <-- Eval(ApplyPure("Subst", {var, tar, exp}));
  130.  
  131.   
  132. /*  Limit without direction  */
  133.   
  134. 10 # Lim(_var, tar_IsInfinity, _exp) <-- Lim(var, tar, None, exp);
  135.  
  136. 20 # Lim(_var, _tar, _exp)
  137. <-- [
  138.   Local(l); l := Lim(var, tar, Left, exp);
  139.   If ( l = Lim(var, tar, Right, exp),
  140.        l,
  141.        Undefined
  142.      );
  143. ];
  144.  
  145.  
  146.  
  147.  
  148. /* User-callable function */
  149.  
  150. (Limit(_var,_lim)(_fie)) <-- Lim(var,lim,fie);
  151. (Limit(_var,_lim,_direction)(_fie)) <-- Lim(var,lim,direction,fie);
  152. UnFence("Limit",3);
  153.  
  154.  
  155.  
  156.  
  157.  
  158.